package com.itlong.cloud.app.dao;

import com.itlong.cloud.POJO.PO.*;
import com.itlong.cloud.POJO.VO.app.AppUserOwnProjectVO;
import com.itlong.cloud.POJO.VO.property.PropertyPaymentVO;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 * APP登录注册版块数据访问接口
 * </desc>
 *
 * @createDate 2017/09/21
 */
@Mapper
@Repository
public interface IAppRegisterDao extends IAbstractBaseDao<AppUserInfoPO> {

    /**
     * <desc>
     * 根据手机号检测APP当前用户的记录条数
     * </desc>
     *
     * @param phoneNo
     * @return 返回当前用户的记录条数
     * @author cuiduanwu
     * @createDate 2017/09/21
     */
    Integer checkUserByPhoneNo(String phoneNo);

    /**
     * <desc>
     *     根据手机号查询用户
     * </desc>
     * @param phoneNo
     * @return
     */
    AppUserInfoPO getUserByPhoneNo(@Param("phoneNo")String phoneNo);

    /**
     * <desc>
     *     根据手机号查询用户
     * </desc>
     * @param email
     * @return
     */
    AppUserInfoPO getUserByEmail(@Param("email")String email);

    /**
     * <desc>
     * 保存APP端用户
     * </desc>
     *
     * @param
     * @return
     * @author cuiduanwu
     * @createDate 2017/09/25
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      校验该用户是否被禁用
     * </desc>
     *
     * @param phoneNo  手机号
     * @return
     * @author Juguang.S
     * @createDate 2019/01/05
     */
    Integer getUserStatus(@Param("phoneNo") String phoneNo);

    /**
     * <desc>
     * 根据手机号更新用户密码
     * </desc>
     *
     * @param params
     * @return
     * @author cuiduanwu
     * @createDate 2017/09/25
     */
    Integer updateUserPswdByPhone(Map<String, String> params);

    /**
     * <desc>
     * 根据邮箱更新用户密码
     * </desc>
     *
     * @param params
     * @return
     * @author shengen.T
     * @createDate 2017/12/29
     */
    Integer updateUserPswdByEmail(Map<String, String> params);


    /**
     * <desc>
     * App用户登录
     * </desc>
     *
     * @param params
     * @return
     * @createDate 2017/9/24
     */
    AppUserInfoPO appUserLogin(Map<String, String> params);

    /**
     * <desc>
     * App用户邮箱登录
     * </desc>
     *
     * @param params
     * @return
     * @createDate 2017/12/27
     */
    AppUserInfoPO appUserLoginByEmail(Map<String, String> params);


    /**
     * <desc>
     * APP端登录获取用户项目列表信息
     * </desc>
     *
     * @param userId 用户ID
     * @return APP用户所拥有的项目配置信息的集合
     * @throws Exception
     * @createDate 2017/9/27
     */
    List<AppUserOwnProjectVO> getUserOwnProjectsInfo(String userId);

    /**
     * <desc>
     * APP端登录根据用户ID与项目编号获取房间总数或业主房间总数
     * </desc>
     *
     * @param params 用户ID与项目编号
     * @return
     * @throws Exception
     * @createDate 2017/9/28
     */
    Integer countUserAttacheInfoInProject(Map<String, Object> params);

    /**
     * <desc>
     * APP端更新用户对象不为空属性
     * </desc>
     *
     * @param appUserInfoPO
     * @return
     * @createDate 2017/10/10
     */
    Integer updateByPoNotNull(AppUserInfoPO appUserInfoPO);

    /**
     * <desc>
     *     根据userId和projectId查询该用户是否欠费
     * </desc>
     * @param projectId 项目编号
     * @param userId 用户Id
     * @return
     * @author Juguang.S
     * @createDate 2019/01/22
     */
    Integer getUserIsForbidden(@Param("projectId") String projectId,@Param("userId") String userId);


    /**
     * <desc>
     *      查询pad用户是否欠费
     * </desc>
     *
     * @param projectId
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/21
     */
    Integer getPadUserForbidden(@Param("projectId") String projectId,@Param("userId") String userId);

    /**
     * <desc>
     *      查询pad用户欠费状态
     *
     * @param projectId
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/21
     */
    Map<String,Object> getPadUserStatus(@Param("projectId") String projectId,@Param("userId") String userId,@Param("type") String type);

    /**
     * <desc>
     *      获取欠费配置信息
     * </desc>
     *
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/26
     */
    List<PropertyValueDeployPO> getDeploys(@Param("projectId") String projectId,@Param("type") String type);

    /**
     * <desc>
     *      获取欠费房间时间
     * </desc>
     *
     * @param projectId
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/26
     */
    String getArrearageTime(@Param("projectId") String projectId,@Param("userId") String userId,
                            @Param("buildArr") String[] buildArr,@Param("unitArr") String[] unitArr);

    /**
     * <desc>
     *      获取设备地址
     * </desc>
     *
     * @param deviceUnique
     * @param type
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/26
     */
    Map<String,Object> getDeviceAddressByDeviceUnique(@Param("deviceUnique") String deviceUnique,@Param("type") String type);

    /**
     * <desc>
     *      获取欠费房间
     * </desc>
     *
     * @param buildArr
     * @param unitArr
     * @return
     * @author Jiaqi.X
     * @createDate 2019/06/26
     */
    Map<String,Object> getArrearRoomInfo(@Param("projectId") String projectId,@Param("userId") String userId,
                                         @Param("buildArr") String[] buildArr,@Param("unitArr") String[] unitArr,
                                         @Param("minTime") String minTime);

    Integer getAppUserStatusByUserId(@Param("userId") String userId);


    /**
     * <desc>
     * 删除app工程人员与项目的关系
     * </desc>
     *
     * @param userId     用户id
     * @param projectIds 项目id集合
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/11
     */
    Integer deleteEngineerProjectRelation(@Param("userId")String userId,@Param("projectIds")String[] projectIds);


    /**
     * <desc>
     * 通过手机号查询用户id
     * </desc>
     *
     * @param phoneNum 手机号
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/11
     */
    String getUserIdByPhoneNum(@Param("phoneNum") String phoneNum);

    /**
     * <desc>
     *      获取用户基础信息
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/12/22
     */
    AppUserInfoPO getBaseUserInfo(@Param("userId") String userId);

    /**
     * <desc>
     *      获取用户email
     * </desc>
     *
     * @param userId 用户id
     * @return
     * @author Jiaqi.X
     * @createDate 2018/01/10
     */
    String getAppUserEmail(@Param("userId") String userId);

    /**
     * <desc>
     *      检测用户项目是否被禁用
     * </desc>
     *
     * @param projectId 项目id
     * @return
     * @authro Jiaqi.X
     * @createDate 2018/01/11
     */
    Integer checkUserProjectStatus(@Param("projectId") String projectId);

    /**
     * <desc>
     *     根据APP端用户的操作日志来自动更新用户Token缓存
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/18
     */
    List<AppUserInfoPO> getOperateAppUser();

    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在迁入的房间
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserRoomInProject(Map<String,Object> map);
    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在电梯权限
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInFloor(Map<String,Object> map);
    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在门禁权限
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInDoor(Map<String,Object> map);
    /**
     * <desc>
     *     查询当前用户在指定项目上是否存在云对讲
     * </desc>
     * @return
     * @author cuiduanwu
     * @createDate 2018/1/19
     */
    Integer countUserAuthInCloudDoor(Map<String,Object> map);

    /**
     * <desc>
     *     根据userId查询当前用户是否有人脸
     * </desc>
     * @return
     * @author Juguang.S
     * @createDate 2018/4/24
     */
    Integer getIsFace(@Param("userId") String userId);

    /**
     * <desc>
     *     根据cardId查询当前用户
     * </desc>
     * @return
     * @author Juguang.S
     * @createDate 2018/4/24
     */
    String getCardUserId(@Param("cardId") String cardId);


    /**
     * <desc>
     *      获取项目的UI状态。
     * <desc/>
     *
     * @param  deviceType 设备类型 1安卓 2ios
     * @param  projectId 项目编号
     * @return
     * @author shengen.T
     * @createDate 2018-05-28
     */
    String getUiStatus(@Param("projectId") String projectId,@Param("deviceType") String deviceType);

    /**
     * <desc>
     *      根据条件查询人员
     * </desc>
     * @param    params  查询参数
     * @return  List<AppUserInfoPO> 人员实体集合
     * @author Juguang.S
     * @createDate 2018/10/16
     *
     */
    List<AppUserInfoPO> getByFields(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户的第三方账号信息
     * </desc>
     *
     * @param cloudIntercomAccountId 第三方提供账号表的逻辑主键
     * @return 第三方账号信息
     * @author wangzhi
     * @createDate 2018/07/17
     */
    CloudIntercomAccountInfoPO getClientAccount(@Param("cloudIntercomAccountId") String cloudIntercomAccountId);

    /**
     * <desc>
     *      根据用户手机号更新Openid
     * </desc>
     *
     * @param openId
     * @return
     * @author Juguang.S
     * @createDate 2019/04/30
     */
    Integer updateOpenIdByPhone(@Param("openId") String openId,@Param("phoneNum") String phoneNum);

    /**
     * <desc>
     *     根据unionId查询当前用户的openid信息
     * </desc>
     * @param unionId
     * @return
     * @author Juguang.S
     * @createDate 2019/05/15
     */
    WeChatUserOpenIdInfoPO getUserOpenIdInfoByPhoneNo(@Param("unionId")String unionId);

    /**
     * <desc>
     *      根据用户unionid更新用户的Openid的信息
     * </desc>
     *
     * @param openId
     * @return
     * @author Juguang.S
     * @createDate 2019/05/15
     */
    Integer updateOpenIdByUnionId(@Param("openId") String openId,@Param("unionId") String unionId,@Param("userId") String userId);

    /**
     * <desc>
     *      获取用户未缴账单信息
     * </desc>
     *
     * @param projectId 项目编号
     * @param userId 用户id
     * @return 用户未缴账单信息
     * @author wangzhi
     * @createDate 2019/05/29
     */
    List<PropertyPaymentVO> getUnpaidBill(@Param("projectId") String projectId, @Param("userId") String userId);

    /**
     * <desc>
     *      批量保存缴费通知
     * </desc>
     *
     * @param propertyInfoPOList 缴费通知列表信息
     * @return 1-成功 0-失败
     * @author wangzhi
     * @createDate 2019/05/29
     */
    Integer batchSavePropertyInfo(List<PropertyInfoPO> propertyInfoPOList);

    /**
     * <desc>
     *      查询该feeId是已经存在缴费通知消息的条数
     * </desc>
     *
     * @param feeId 账单id
     * @return 该feeId是已经存在缴费通知消息的条数
     * @author wangzhi
     * @createDate 2019/05/29
     */
    String getPropertyInfoFeeTimeByFeeId(@Param("feeId") String feeId);

    /**
     * <desc>
     *      查询该用户该项目下的缴费通知消息条数
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @return 该用户该项目下的缴费通知消息条数
     * @author wangzhi
     * @createDate 2019/05/29
     */
    Integer getPropertyInfoCountOfUser(@Param("projectId") String projectId, @Param("userId") String userId);

    /**
     * <desc>
     *      获取欠费房间id，取一个
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @return 一个欠费房间id
     * @author wangzhi
     * @createDate 2019/05/29
     */
    String getArrearRoomId(@Param("projectId") String projectId, @Param("userId") String userId);

    /**
     * <desc>
     *      获取房间下所有的住户
     * </desc>
     *
     * @param roomId 房间id
     * @return 房间下所有的住户
     * @author wangzhi
     * @createDate 2019/06/06
     */
    List<String> getUserIdByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      查询该用户该项目下的小区通知和系统消息条数
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @return 该用户该项目下的小区通知和系统消息条数
     * @author wangzhi
     * @createDate 2019/06/20
     */
    Integer getAllUnreadPushInfoCount(@Param("projectId") String projectId, @Param("userId") String userId, @Param("version") String version);

    /**
     * <desc>
     *      根据userId 登录密码校验密码的正确性
     * </desc>
     *
     * @param userId 用户id
     * @param loginPwd 登录密码
     * @return
     * @throws Exception
     * @createDate 2019/9/17
     */
    Integer checkLoginPwd(@Param("userId") String userId,@Param("loginPwd") String loginPwd);

    /**
     * <desc>
     *      游客登录
     * </desc>
     *
     * @param uuid 设备ID
     * @return 登录信息
     * @author wangzhi
     * @createDate 2020/04/30
     */
    AppUserInfoPO getTouristUser(@Param("uuid") String uuid);

    /**
     * <desc>
     *      获取完善定位开启游客的项目信息
     * </desc>
     *
     * @return 完善定位开启游客的项目信息
     * @author wangzhi
     * @createDate 2020/04/30
     */
    List<Map<String, Object>> getAllProjectHasPosition();

    /**
     * <desc>
     *      获取游客项目信息
     * </desc>
     *
     * @return 项目信息
     * @author wangzhi
     * @createDate 2020/05/11
     */
    AppUserOwnProjectVO getTouristProject(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取游客项目历史信息
     * </desc>
     *
     * @return 游客项目历史信息
     * @author wangzhi
     * @createDate 2020/05/12
     */
    GuestUserHistoryPO getGuestUserProject(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      修改游客项目历史信息
     * </desc>
     *
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2020/05/12
     */
    Integer updateGuestUserProject(GuestUserHistoryPO guestUserHistoryPO);

    /**
     * <desc>
     *      查询用户在项目下是否被禁用
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @throws Exception
     * @createDate 2020/11/23
     */
    Integer getUserStatusByProjectId(@Param("userId") String userId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户已认证的房间数量
     * </desc>
     *
     * @param params 查询参数
     * @return 用户已认证的房间数量
     * @Author Zhu.yj
     * @createDate  2021/4/7
     */
    Integer getUserRoomCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户所有设备权限
     * </desc>
     *
     * @param params 查询参数
     * @return 用户已有权限数量（数量不准确，这里只为区分是否有权限）
     * @Author Zhu.yj
     * @createDate  2021/4/7
     */
    Integer getUserDeviceAuthCount(Map<String, Object> params);
}
